const Koa=require('koa')
const mysql = require('mysql2')
const config = require('./config')
const body = require('koa-body')
const SocketIO = require('socket.io')
const Router = require('./lib/router')
const User = require('./lib/user')
const func = require('./lib/functions')

const pool = mysql.createPool({
    host:config.db.host, 
    user: config.db.user, 
    password:config.db.password,
    database: config.db.database
});
const promisePool=pool.promise();

const app = new Koa();
const io = new SocketIO(config.webSocketPort);
const users=new User(io);

const router=Router(io,config,users)
app.use(body())
app.use(router.routes())
app.use(router.allowedMethods())

//监听socket连接
io.on('connection',function(socket){
    console.log('用户连接...');
    socket.emit('test',{status:1,msg:'test用户!'})
    socket.on('test',data=>{
        console.log('test:',data);
    })
    /**
     * 用户连接登录(其实更安全验证应该通过web服务器生成的token进行绑定用户)
     * token的生成和解析请参考：extend/jwt/Jwt.php
     * @param  {Object} data {id,login_name}
     * @return {[type]}      [description]
     */
    socket.on('login',async (data)=>{
        if(!data)return;
        if(typeof data ==='string'){
            data=JSON.parse(data);
        }
        //ID指member_id 增加 device_id
        if(!data.id||!data.login_name){  
            socket.emit('login',{status:1,msg:'WebSocket验证数据不能为空!'})
            return;
        }

        // 此处应该进行用户身份验证（略）
        try{
            // const [rows] = await promisePool.query(`SELECT id,login_name from ${config.db.prefix}member where id=?`,[data.id]);
            // if(!rows.length||(rows[0].login_name!==data.login_name)){
            //     socket.emit('login',{status:1,msg:'WebSocket登录验证信息不通过!'})
            //     return;
            // }
        }catch(e){
            console.log(e);
            socket.emit('login',{status:1,msg:'WebSocket登录服务器出错，请重试!'})
            return;
        }
        socket.member_id=data.id
        if(data.type){ //Web 服务器连接
            socket.type='admin';
            socket.join(data.id.toString()+'admin');
        }else{
            socket.type='device';
            socket.join(data.id);
        }
        if(data.device_id){
            socket.device_id=data.device_id;
            users.add(socket.id,data.id,data.device_id);
            
        }
        console.log('登录成功...',data);
        socket.emit('login',{status:0,msg:'ok'})

    })
    // 在线用户ID组(来自web服务端)
    socket.on('getUsers',_=>{
        console.log('getUsers:')
        if(socket.type==='admin'&&socket.member_id){
            users.syncDevices(socket.member_id);
        }
    })

    // 转发客户端事件（实现单个用户同时登录的同步状态）
    socket.on('client event',data=>{
        if(data.event&&data.event.indexOf('client_')===0){
            socket.emit(data.event,data.data);
        }
    })

    // 客户端与客户端直接的通讯
    socket.on('client to client',data=>{
        if(data.event&&data.event.indexOf('client_')===0){
            if(data.rid){ //单客户端发送
                if(socket.type==='admin'){
                    io.to(data.rid.toString()+'admin').emit(data.event,data.data);
                }else{
                    io.to(data.rid).emit(data.event,data.data);
                }
                // 同时给自己也发一份
                if(data.rid!=socket.member_id){
                    socket.emit(data.event,data.data);
                }
            }else{ //广播
                io.emit(data.event,data.data);
            }
            
        }
    })

    socket.on('disconnecting',err=>{
        if(!socket.member_id){
            return;
        }
        if(socket.type==='device'&&socket.device_id){
            users.remove(socket.member_id,socket.device_id);
            // 同步web服务器用户在线设备
            users.syncDevices(socket.member_id);
        }
        
    })

    socket.on('error',err=>{
        console.log('onError：',err)
    })
})

app.listen(config.httpPort)
